# This Python file uses the following encoding: utf-8
# @author runhey
# github https://github.com/runhey
import numpy as np

from module.base.decorator import cached_property
from module.logger import logger


class RuleClick:

    def __init__(self, roi_front: tuple, roi_back: tuple, name: str = None) -> None:
        """
        初始化
        :param roi_front: 前景区域
        :param roi_back: 后景区域
        :param name: 名称
        """
        # 设置前ROI
        self.roi_front = roi_front
        # 设置后ROI
        self.roi_back = roi_back
        # 如果有名字，则设置名字
        if name:
            self.name = name
        # 否则，设置默认名字为'click'
        else:
            self.name = 'click'
    def coord(self) -> tuple:
        """
        获取坐标, 从roi_front随机获取坐标
        :return: 坐标
        """
        # 获取roi_front的坐标和宽高
        x, y, w, h = self.roi_front
        # 在roi_front的范围内随机生成一个x坐标
        x = np.random.randint(x, x + w)
        # 在roi_front的范围内随机生成一个y坐标
        y = np.random.randint(y, y + h)
        # 返回随机生成的x和y坐标
        return x, y

    def coord_more(self) -> tuple:
        """
        从roi_back随机获取坐标
        :return: 坐标
        """
        x, y, w, h = self.roi_back
        x = np.random.randint(x, x + w)
        y = np.random.randint(y, y + h)
        return x, y

    @property
    def center(self) -> tuple:
        """
        返回roi_front的中心坐标
        :return: 中心坐标
        """
        # 获取roi_front的坐标和宽高
        x, y, w, h = self.roi_front
        # 将x坐标加上自身
        x += x
        # 将y坐标加上自身
        y += y
        # 如果x坐标小于等于0，则将x坐标设为0
        if x <= 0 :
            x = 0
        # 如果x坐标大于等于1280，则将x坐标设为1280
        elif x >= 1280:
            x = 1280

        # 如果y坐标小于等于0，则将y坐标设为0
        if y <= 0 :
            y = 0
        # 如果y坐标大于等于720，则将y坐标设为720
        elif y >= 720:
            y = 720

        # 将新的坐标和宽高赋值给roi_front
        self.roi_front = x, y, w, h  # 返回roi_front的中心点坐标
        return x + w // 2, y + h // 2

    def move(self, x: int, y: int) -> None:
        """
        移动roi_front, 需要限幅x是0-1280, y是0-720
        :param x: x坐标
        :param y: y坐标
        :return:
        """
        x, y, w, h = self.roi_front
        x += x# 获取roi_front的坐标和宽高
        x, y, w, h = self.roi_front
        # 将x坐标加上自身
        x += x
        # 将y坐标加上自身
        y += y
        # 如果x坐标小于等于0，则将x坐标设为0
        if x <= 0 :
            x = 0
        # 如果x坐标大于等于1280，则将x坐标设为1280
        elif x >= 1280:
            x = 1280

        # 如果y坐标小于等于0，则将y坐标设为0
        if y <= 0 :
            y = 0
        # 如果y坐标大于等于720，则将y坐标设为720
        elif y >= 720:
            y = 720

        # 将新的坐标和宽高赋值给roi_front
        self.roi_front = x, y, w, h

        y += y
        if x <= 0 :
            x = 0
        elif x >= 1280:
            x = 1280

        if y <= 0 :
            y = 0
        elif y >= 720:
            y = 720

        self.roi_front = x, y, w, h
